home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / os2 / pmnos11s / pop3cli.c < prev    next >
C/C++ Source or Header  |  1993-07-30  |  3KB  |  154 lines

  1. /* Post Office Protocol (POP3) Client -- RFC1225
  2.  * Copyright 1992 William Allen Simpson
  3.  *    partly based on a NNTP client design by Anders Klemets, SM0RGV
  4.  *      and POP2 Client by Mike Stockett, WA7DYX, et alia.
  5.  */
  6. #include <stdio.h>
  7. #include <time.h>
  8. #include "global.h"
  9. #include "timer.h"
  10. #include "proc.h"
  11. #include "netuser.h"
  12. #include "socket.h"
  13. #include "cmdparse.h"
  14. #include "files.h"
  15. #include "mailcli.h"
  16. #include "mailutil.h"
  17. #include "smtp.h"
  18. #if defined(PM)
  19. extern void MailNotify(char *pszUser);
  20. #endif
  21.  
  22.  
  23. void
  24. pop3_job(unused,v1,p2)
  25. int unused;
  26. void *v1;
  27. void *p2;
  28. {
  29.     struct mailservers *np = v1;
  30.     struct sockaddr_in fsocket;
  31.     char buf[TLINELEN];
  32.     char *cp;
  33.     FILE *wfp = NULLFILE;
  34.     time_t t;
  35.     int s = -1;
  36.     int bytes;
  37.     int messages;
  38.     int i;
  39.  
  40.     if ( mailbusy( np ) )
  41.         return;
  42.  
  43.     if ( (fsocket.sin_addr.s_addr = resolve(np->hostname)) == 0L ) {
  44.         /* No IP address found */
  45.         if (Mailtrace >= 1)
  46.             log(-1,"POP3 can't resolve host '%s'", np->hostname);
  47.         start_timer(&np->timer);
  48.         return;
  49.     }
  50.  
  51.     fsocket.sin_family = AF_INET;
  52.     fsocket.sin_port = IPPORT_POP3;
  53.  
  54.     s = socket(AF_INET,SOCK_STREAM,0);
  55.     sockmode(s,SOCK_ASCII);
  56.  
  57.     if (connect(s,(char *)&fsocket,SOCKSIZE) == -1) {
  58.         cp = sockerr(s);
  59.         if (Mailtrace >= 2)
  60.             log(s,"POP3 Connect failed: %s",
  61.                 cp != NULLCHAR ? cp : "" );
  62.         goto quit;
  63.     }
  64.  
  65.     log(s,"POP3 Connected to mailhost %s", np->hostname);
  66.  
  67.     /* Eat the banner */
  68.     if ( mailresponse( s, buf, "banner" ) == -1
  69.       || buf[0] == '-' ) {
  70.         goto quit;
  71.     }
  72.  
  73.     usprintf(s,"USER %s\n", np->username);
  74.     if ( mailresponse( s, buf, "USER" ) == -1
  75.       || buf[0] == '-' ) {
  76.         goto quit;
  77.     }
  78.  
  79.     usprintf(s,"PASS %s\n", np->password);
  80.     if ( mailresponse( s, buf, "PASS" ) == -1
  81.       || buf[0] == '-' ) {
  82.         goto quit;
  83.     }
  84.  
  85.     usprintf(s,"STAT\n" );
  86.     if ( mailresponse( s, buf, "STAT" ) == -1
  87.       || buf[0] == '-' ) {
  88.         goto quit;
  89.     }
  90.  
  91.     rip(buf);
  92.     if ( Mailtrace >= 1 )
  93.         log(s,"POP3 status %s",buf);
  94.     sscanf(buf,"+OK %d %d",&messages,&bytes);
  95.  
  96.     if ((wfp = tmpfile()) == NULLFILE) {
  97.         if ( Mailtrace >= 1 )
  98.             log(s,"POP3 Cannot create %s", "tmp file" );
  99.         goto quit;
  100.     }
  101.  
  102.     for ( i = 0; i++ < messages; ) {
  103.         usprintf(s,"RETR %d\n", i);
  104.         if ( mailresponse( s, buf, "RETR" ) == -1 )
  105.             goto quit;
  106.         if ( buf[0] == '-' ) {
  107.             continue;
  108.         }
  109.  
  110.         time(&t);
  111.         fprintf( wfp, "From POP3@%s %s",
  112.             np->hostname,
  113.             ctime(&t));
  114.  
  115.         if ( recvmail(s, buf, TLINELEN, wfp, Mailtrace) == -1 ) {
  116.             goto quit;
  117.         }
  118.  
  119.         usprintf(s,"DELE %d\n", i);
  120.         if ( mailresponse( s, buf, "DELE" ) == -1
  121.           || buf[0] == '-' ) {
  122.             goto quit;
  123.         }
  124.     }
  125.  
  126.     if ( messages == 0 ) {
  127.         /* Quit for politeness sake */
  128.         usprintf(s,"QUIT\n" );
  129.         mailresponse( s, buf, "QUIT" );
  130.     } else if ( copymail( Mailspool, np->mailbox,
  131.             buf, TLINELEN, wfp, Mailtrace ) != -1 ) {
  132.         /* Quit command allows the deletions to complete */
  133.         usprintf(s,"QUIT\n" );
  134.         mailresponse( s, buf, "QUIT" );
  135. #if defined(PM)
  136.         MailNotify(np->mailbox);
  137. #endif
  138.         tprintf("New mail arrived for %s from mailhost %s%c\n",
  139.                 np->mailbox,
  140.                 np->hostname,
  141.                 Mailquiet ? ' ' : '\007');
  142.     }
  143.  
  144. quit:
  145.     log(s,"POP3 daemon exiting" );
  146.     close_s(s);
  147.  
  148.     if (wfp != NULLFILE)
  149.         fclose(wfp);
  150.     start_timer(&np->timer);
  151. }
  152.  
  153.  
  154.